repo: Hold an fd "repo_dir_fd" open for the toplevel too
authorColin Walters <walters@verbum.org>
Mon, 2 Feb 2015 19:56:39 +0000 (14:56 -0500)
committerColin Walters <walters@verbum.org>
Thu, 5 Feb 2015 19:15:34 +0000 (14:15 -0500)
We could just make everything relative to this, but the objects/ and
tmp/ are accessed very often, so I think it's worth holding individual
fds.

This fd can cover everything else: refs, deltas, etc.

src/libostree/ostree-repo-private.h
src/libostree/ostree-repo.c

index f38db570ed4df5a5d63a9f6395baba11ef942d47..82d3534330215a1093afaf2ae748a2c69a10263d 100644 (file)
@@ -37,6 +37,7 @@ struct OstreeRepo {
   char *boot_id;
 
   GFile *repodir;
+  int    repo_dir_fd;
   GFile *tmp_dir;
   int    tmp_dir_fd;
   GFile *local_heads_dir;
index 1fc9ed174a9267d2941da838caf9d3779dd191a1..1de17a869795172ed97b78fe60889f8c8424e8b8 100644 (file)
@@ -328,6 +328,8 @@ ostree_repo_finalize (GObject *object)
 
   g_free (self->boot_id);
   g_clear_object (&self->repodir);
+  if (self->repo_dir_fd != -1)
+    (void) close (self->repo_dir_fd);
   g_clear_object (&self->tmp_dir);
   if (self->tmp_dir_fd)
     (void) close (self->tmp_dir_fd);
@@ -453,6 +455,7 @@ ostree_repo_init (OstreeRepo *self)
                                          (GDestroyNotify) ost_remote_unref);
   g_mutex_init (&self->remotes_lock);
 
+  self->repo_dir_fd = -1;
   self->objects_dir_fd = -1;
   self->uncompressed_objects_dir_fd = -1;
 }
@@ -1288,13 +1291,20 @@ ostree_repo_open (OstreeRepo    *self,
     goto out;
   g_strdelimit (self->boot_id, "\n", '\0');
 
-  if (!gs_file_open_dir_fd (self->objects_dir, &self->objects_dir_fd, cancellable, error))
+  if (!gs_file_open_dir_fd (self->repodir, &self->repo_dir_fd, cancellable, error))
     {
-      g_prefix_error (error, "Reading objects/ directory: ");
+      g_prefix_error (error, "%s: ", gs_file_get_path_cached (self->repodir));
       goto out;
     }
 
-  self->writable = faccessat (AT_FDCWD, gs_file_get_path_cached (self->objects_dir), W_OK, 0) == 0;
+  if (!gs_file_open_dir_fd_at (self->repo_dir_fd, "objects",
+                               &self->objects_dir_fd, cancellable, error))
+    {
+      g_prefix_error (error, "Opening objects/ directory: ");
+      goto out;
+    }
+
+  self->writable = faccessat (self->objects_dir_fd, ".", W_OK, 0) == 0;
 
   if (fstat (self->objects_dir_fd, &stbuf) != 0)
     {